{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "b81d1e68-a83f-4ec3-8867-5948097f9c94",
   "metadata": {},
   "source": [
    "# Pandas 数据计算与转换教程\n",
    "\n",
    "## 课程介绍\n",
    "\n",
    "在数据分析过程中，数据计算和转换是最常见也是最重要的操作。相比Excel中的公式和数据透视表，Pandas提供了更强大和灵活的数据处理能力。本章节将介绍：\n",
    "\n",
    "1. 如何进行高效的数据计算\n",
    "2. 如何使用统计函数进行数据分析\n",
    "3. 如何进行数据格式的转换和重塑\n",
    "4. 如何处理复杂的数据透视需求\n",
    "\n",
    "通过本章节的学习，你将能够：\n",
    "\n",
    "- 摆脱Excel复杂的公式嵌套\n",
    "- 实现批量化的数据计算\n",
    "- 灵活处理各种数据格式的转换\n",
    "- 深入理解数据透视的原理和应用\n",
    "\n",
    "让我们首先准备数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "7b19add5-8f30-402a-93fb-74a06ca939f1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入所需的库\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "# 读取数据\n",
    "df_students = pd.read_csv('data/student_info.csv')\n",
    "df_orders = pd.read_csv('data/order_info.csv')\n",
    "df_products = pd.read_csv('data/product_info.csv')\n",
    "df_order_details = pd.read_csv('data/order_details.csv')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "99c70501-b534-4cc9-95be-28676f3f7058",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 转换日期列\n",
    "df_orders['订单日期'] = pd.to_datetime(df_orders['订单日期'])\n",
    "df_orders['下单时间'] = pd.to_datetime(df_orders['下单时间'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d47c6f32-4137-4c1c-9b32-a4608f7cd8fa",
   "metadata": {},
   "source": [
    "# 基础计算操作\n",
    "\n",
    "在数据分析工作中，数据计算是最基础也是最常见的操作。与Excel相比，Pandas提供了更高效和灵活的计算方式。本节将介绍四种主要的计算操作：算术运算、统计函数、累计计算和自定义函数应用。\n",
    "\n",
    "## 算术运算\n",
    "\n",
    "### 原理介绍\n",
    "\n",
    "Pandas的算术运算是向量化的，这意味着可以直接对整列数据进行运算，无需使用循环。类似于Excel中对整列使用公式，但更加高效和灵活。\n",
    "\n",
    "### 主要特点：\n",
    "\n",
    "1. **高效性**：底层使用numpy实现，性能远超Python循环\n",
    "2. **简洁性**：一行代码即可替代复杂的循环操作\n",
    "3. **自动对齐**：基于索引自动对齐数据进行计算\n",
    "\n",
    "### 常见运算：\n",
    "\n",
    "- 基本运算：+、-、*、/\n",
    "- 整除：//\n",
    "- 求余：%\n",
    "- 幂运算：**\n",
    "\n",
    "### 代码示例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a86e2c99-f8ab-43db-aa9d-dd21c99536a4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "基础运算结果示例：\n",
      "      订单金额       成本       利润  折扣比例  每件商品均价\n",
      "0  1102.11  771.477  330.633  0.00  367.37\n",
      "1    88.35   61.845   26.505  0.00   29.45\n",
      "2   108.48   75.936   32.544  0.00   54.24\n",
      "3    79.72   55.804   23.916  0.09   79.72\n",
      "4   404.97  283.479  121.491  6.42  134.99\n"
     ]
    }
   ],
   "source": [
    "# 示例1：基础价格计算\n",
    "df_orders['成本'] = df_orders['订单金额'] * 0.7  # 计算成本\n",
    "df_orders['利润'] = df_orders['订单金额'] - df_orders['成本']  # 计算利润\n",
    "\n",
    "# 示例2：折扣计算\n",
    "df_orders['折扣比例'] = (df_orders['优惠金额'] / df_orders['订单金额'] * 100).round(2)\n",
    "\n",
    "# 示例3：多列运算\n",
    "df_orders['每件商品均价'] = (df_orders['订单金额'] / df_orders['购买数量']).round(2)\n",
    "\n",
    "print(\"基础运算结果示例：\")\n",
    "print(df_orders[['订单金额', '成本', '利润', '折扣比例', '每件商品均价']].head())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "527752c7-9263-4863-88d2-604c30adbe21",
   "metadata": {},
   "source": [
    "### 注意事项：\n",
    "\n",
    "1. 运算中含有空值时，结果也会是空值\n",
    "2. 不同数据类型运算时可能发生强制类型转换\n",
    "3. 注意除零错误的处理\n",
    "\n",
    "##  统计函数\n",
    "\n",
    "### 原理介绍\n",
    "\n",
    "统计函数提供了对数据进行描述性统计的快捷方式，相当于Excel中的统计函数但使用更便捷。\n",
    "\n",
    "### 常用统计函数：\n",
    "\n",
    "1. **基础统计**\n",
    "   - count(): 非空值计数\n",
    "   - sum(): 求和\n",
    "   - mean(): 平均值\n",
    "   - median(): 中位数\n",
    "\n",
    "2. **分布统计**\n",
    "   - std(): 标准差\n",
    "   - var(): 方差\n",
    "   - min()/max(): 最小值/最大值\n",
    "   - quantile(): 分位数\n",
    "\n",
    "### 代码示例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "9ac91475-fded-40b5-adbc-08254cc70602",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "订单金额基本统计：\n",
      "count     3028.00\n",
      "mean      1298.72\n",
      "std       3187.90\n",
      "min          6.11\n",
      "25%        114.57\n",
      "50%        280.36\n",
      "75%        721.28\n",
      "max      24901.15\n",
      "Name: 订单金额, dtype: float64\n",
      "\n",
      "多字段统计：\n",
      "              订单金额     购买数量\n",
      "count      3028.00      NaN\n",
      "sum     3932526.42  9106.00\n",
      "mean       1298.72     3.01\n",
      "median      280.36      NaN\n",
      "std        3187.90      NaN\n",
      "min           6.11      NaN\n",
      "max       24901.15     5.00\n",
      "\n",
      "各专业订单统计：\n",
      "       订单数       订单总额   平均订单金额  总购买数量\n",
      "专业                                   \n",
      "信息管理   434  556239.77  1281.66   1292\n",
      "工商管理   418  565460.24  1352.78   1265\n",
      "市场营销   418  578559.54  1384.11   1249\n",
      "数据科学   420  581823.30  1385.29   1293\n",
      "物流管理   423  627252.51  1482.87   1233\n",
      "电子商务   432  482422.01  1116.72   1294\n",
      "计算机科学  483  540769.05  1119.60   1480\n"
     ]
    }
   ],
   "source": [
    "# 方法一：使用agg/aggregate方法\n",
    "order_stats = df_orders['订单金额'].agg({\n",
    "    '订单数': 'count',\n",
    "    '总金额': 'sum',\n",
    "    '平均金额': 'mean',\n",
    "    '中位数': 'median',\n",
    "    '标准差': 'std',\n",
    "    '最小值': 'min',\n",
    "    '最大值': 'max'\n",
    "}).round(2)\n",
    "\n",
    "# 或者方法二：使用describe()方法（更简便）\n",
    "order_stats = df_orders['订单金额'].describe().round(2)\n",
    "\n",
    "print(\"订单金额基本统计：\")\n",
    "print(order_stats)\n",
    "\n",
    "# 如果要更灵活的统计，可以这样写：\n",
    "order_stats = df_orders.agg({\n",
    "    '订单金额': ['count', 'sum', 'mean', 'median', 'std', 'min', 'max'],\n",
    "    '购买数量': ['sum', 'mean', 'max']\n",
    "}).round(2)\n",
    "\n",
    "print(\"\\n多字段统计：\")\n",
    "print(order_stats)\n",
    "\n",
    "# 分组统计示例\n",
    "major_stats = df_orders.groupby('专业').agg({\n",
    "    '订单金额': ['count', 'sum', 'mean'],\n",
    "    '购买数量': 'sum'\n",
    "}).round(2)\n",
    "\n",
    "# 重命名列名使其更易读\n",
    "major_stats.columns = ['订单数', '订单总额', '平均订单金额', '总购买数量']\n",
    "\n",
    "print(\"\\n各专业订单统计：\")\n",
    "print(major_stats)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "095a206c-dd3f-4cea-96d6-96014f6350af",
   "metadata": {},
   "source": [
    "# Pandas中的agg/aggregate函数详解\n",
    "\n",
    "## 基本概念\n",
    "\n",
    "agg (aggregate的简写) 是Pandas中用于数据聚合的高级函数，它可以：\n",
    "\n",
    "1. 同时对多个列执行不同的统计操作\n",
    "2. 使用内置或自定义的聚合函数\n",
    "3. 灵活命名聚合结果\n",
    "4. 支持分组后的聚合操作\n",
    "\n",
    "## agg的基本用法\n",
    "\n",
    "###  单列单个聚合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "f43c6998-503a-4115-881a-8d042525f976",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "订单总金额: 3932526.42\n",
      "订单总金额: 3932526.42\n"
     ]
    }
   ],
   "source": [
    "# 最基础的用法：对单列进行单个统计\n",
    "result = df_orders['订单金额'].agg('sum')\n",
    "print(\"订单总金额:\", result)\n",
    "\n",
    "# 等价写法\n",
    "result = df_orders['订单金额'].agg(func='sum')\n",
    "print(\"订单总金额:\", result)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f96b44c5-fc18-4e35-8e91-9bd2939b7615",
   "metadata": {},
   "source": [
    "单列多个聚合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "56637b43-eb8c-4ed2-ac47-5d3ad99af3cb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "订单金额的多个统计指标：\n",
      "sum     3.932526e+06\n",
      "mean    1.298721e+03\n",
      "max     2.490115e+04\n",
      "min     6.110000e+00\n",
      "Name: 订单金额, dtype: float64\n"
     ]
    }
   ],
   "source": [
    "# 对单列进行多个统计\n",
    "result = df_orders['订单金额'].agg(['sum', 'mean', 'max', 'min'])\n",
    "print(\"\\n订单金额的多个统计指标：\")\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "8188193a-6703-4b2e-af33-9f03679312d3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pandas.core.series.Series"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(result)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43e0728a-713e-4c03-9bfa-2fb84b21de93",
   "metadata": {},
   "source": [
    "多列相同聚合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "d5092e19-7b43-4c4f-bf94-3fae2b7c4957",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "多列相同统计指标：\n",
      "              订单金额         购买数量\n",
      "sum   3.932526e+06  9106.000000\n",
      "mean  1.298721e+03     3.007266\n"
     ]
    }
   ],
   "source": [
    "# 对多个列执行相同的聚合操作\n",
    "result = df_orders[['订单金额', '购买数量']].agg(['sum', 'mean'])\n",
    "print(\"\\n多列相同统计指标：\")\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1569e837-607b-4295-a20e-5b9fe017fc57",
   "metadata": {},
   "source": [
    "多列不同聚合\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "35b337bc-c22d-4a4e-bf7d-b5b41ccf0056",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "多列不同统计指标：\n",
      "               订单金额         购买数量          评分\n",
      "sum    3.932526e+06  9106.000000         NaN\n",
      "mean   1.298721e+03     3.007266    2.981763\n",
      "max    2.490115e+04          NaN         NaN\n",
      "count           NaN          NaN  987.000000\n"
     ]
    }
   ],
   "source": [
    "# 对不同列执行不同的聚合操作\n",
    "result = df_orders.agg({\n",
    "    '订单金额': ['sum', 'mean', 'max'],\n",
    "    '购买数量': ['sum', 'mean'],\n",
    "    '评分': ['mean', 'count']\n",
    "})\n",
    "print(\"\\n多列不同统计指标：\")\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1db8cda6-9737-4a54-bca7-b09efa4914a0",
   "metadata": {},
   "source": [
    "agg使用自定义函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "5d8e75e6-b4f5-40f2-9869-88c88b634c59",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数值范围: 24895.04\n",
      "\n",
      "订单汇总统计：\n",
      "总和      3.932526e+06\n",
      "平均值     1.298721e+03\n",
      "最大值     2.490115e+04\n",
      "最小值     6.110000e+00\n",
      "数据范围    2.489504e+04\n",
      "标准差     3.187899e+03\n",
      "样本数     3.028000e+03\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "# 首先导入必要的库\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "# 1.1 最简单的自定义聚合函数\n",
    "def value_range(x):\n",
    "    \"\"\"计算数值范围\"\"\"\n",
    "    return x.max() - x.min()\n",
    "\n",
    "# 使用方式\n",
    "result1 = df_orders['订单金额'].agg(value_range)\n",
    "print(\"数值范围:\", result1)\n",
    "#自定义的函数作为参数传入\n",
    "# 1.2 返回多个统计值的函数\n",
    "def order_summary(x):\n",
    "    \"\"\"返回一个包含多个统计值的Series\"\"\"\n",
    "    return pd.Series({\n",
    "        '总和': x.sum(),\n",
    "        '平均值': x.mean(),\n",
    "        '最大值': x.max(),\n",
    "        '最小值': x.min(),\n",
    "        '数据范围': x.max() - x.min(),\n",
    "        '标准差': x.std(),\n",
    "        '样本数': len(x)\n",
    "    })\n",
    "\n",
    "# 使用方式\n",
    "result2 = df_orders['订单金额'].agg(order_summary)\n",
    "print(\"\\n订单汇总统计：\")\n",
    "print(result2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e8cdfaf9-11c9-4391-8fb4-5689754defa4",
   "metadata": {},
   "source": [
    "数据透视表（Pivot Table）是一种数据分析工具，用于快速汇总、分类和整理大量数据，帮助你从不同角度查看和理解数据。它可以将原始数据转换成有意义的报告，而不需要手动进行复杂的计算。\n",
    "\n",
    "### 通俗解释\n",
    "想象你有一大堆详细的销售记录，包括销售人员、销售产品、销售日期、销售额等。数据透视表可以帮你快速回答这些问题，比如：\n",
    "- **每个销售人员的总销售额是多少？**\n",
    "- **每种产品在不同时间段的销售额如何？**\n",
    "- **不同地区的销售表现如何？**\n",
    "\n",
    "### 数据透视表是怎么工作的？\n",
    "你可以把数据透视表想象成一个灵活的电子表格，它允许你“旋转”和重新排列数据，从不同角度来查看和分析。例如：\n",
    "- **行（Row）**：你可以将某个字段（如销售人员或产品）拖到行区域，数据透视表会按这个字段分类显示数据。\n",
    "- **列（Column）**：你可以将另一个字段（如销售年份或月份）拖到列区域，数据透视表会按这个字段进一步分类显示数据。\n",
    "- **值（Values）**：你可以将数值字段（如销售额）拖到值区域，数据透视表会自动计算总和、平均值或其他汇总结果。\n",
    "- **筛选（Filter）**：你可以对某个字段进行筛选，只显示你感兴趣的部分数据。\n",
    "\n",
    "### 举个简单的例子\n",
    "假设你有以下销售数据：\n",
    "\n",
    "| 销售人员 | 产品   | 销售额 | 销售地区 |\n",
    "|--------|-------|------|--------|\n",
    "| 张三   | 手机   | 5000 | 北京    |\n",
    "| 李四   | 电脑   | 7000 | 上海    |\n",
    "| 张三   | 电脑   | 8000 | 北京    |\n",
    "| 李四   | 手机   | 6000 | 上海    |\n",
    "\n",
    "**用数据透视表可以很快回答这些问题：**\n",
    "- **每个销售人员的总销售额是多少？**\n",
    "  - 数据透视表会显示张三的总销售额是 13000 元，李四的总销售额是 13000 元。\n",
    "- **不同产品的销售额是多少？**\n",
    "  - 数据透视表会显示手机的总销售额是 11000 元，电脑的总销售额是 15000 元。\n",
    "\n",
    "### 数据透视表的好处\n",
    "- **节省时间**：你可以快速生成各种报告，而不需要手动汇总或筛选数据。\n",
    "- **灵活性**：可以随时调整和重新排列数据，以不同方式查看信息。\n",
    "- **直观**：让你更清晰地理解数据背后的趋势和模式。\n",
    "\n",
    "总之，数据透视表是一个非常强大的数据分析工具，特别适合用来处理和分析大规模数据。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0a76c7d2-b851-4384-af97-84edcb946298",
   "metadata": {},
   "source": [
    "# 数据重塑：Excel透视表的进阶版\n",
    "\n",
    "在Excel中，我们经常使用数据透视表来汇总和分析数据。Pandas提供了更强大和灵活的数据重塑功能，让我们能够实现更复杂的数据分析。\n",
    "\n",
    "## 1. 宽表转长表（melt）\n",
    "\n",
    "相当于Excel中的\"取消数据透视表\"操作，但更加灵活。\n",
    "\n",
    "### 场景演示：\n",
    "\n",
    "假设我们有一个按月份展开的销售数据表（类似Excel中横向展开的月度数据）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "0c9ce21b-934f-45b7-8b5e-7f70d992de15",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始宽表格式（类似Excel中横向展示的月度数据）：\n",
      "订单日期    2023-11   2023-12   2024-01   2024-02   2024-03   2024-04   2024-05  \\\n",
      "专业                                                                            \n",
      "信息管理   43676.33  59593.77  45578.17  41135.02  68941.80  64959.57  41980.36   \n",
      "工商管理   27915.15  41014.17  51635.00  41442.01  33521.18  36332.57  36165.84   \n",
      "市场营销   38290.83  55727.03  20737.00  55638.84  65791.67  55084.39  64424.84   \n",
      "数据科学   14463.78  57534.27  70765.14  28593.38  33918.11  48473.62  59405.50   \n",
      "物流管理   45543.72  73085.44  61513.67  47205.34  76263.58  36268.07  77731.01   \n",
      "电子商务   13845.15  28309.78  37909.66  37498.87  54391.46  25786.24  69512.65   \n",
      "计算机科学  30531.37  48843.22  46765.20  37793.04  54346.41  97401.54  30895.39   \n",
      "\n",
      "订单日期    2024-06   2024-07   2024-08   2024-09   2024-10   2024-11  \n",
      "专业                                                                 \n",
      "信息管理   18765.72  27767.06  27177.46  42569.20  33903.75  40191.56  \n",
      "工商管理   66153.27  37304.60  80223.30  71038.51  32719.52   9995.12  \n",
      "市场营销   72176.27  36396.25  18158.41  34474.42  37887.24  23772.35  \n",
      "数据科学   61520.83  35402.25  58421.13  41461.93  53232.36  18631.00  \n",
      "物流管理   37758.74  34934.78  29799.39  18258.42  75293.14  13597.21  \n",
      "电子商务   26566.12  15252.59  34103.95  59846.70  75731.20   3667.64  \n",
      "计算机科学  36823.72  28909.74  62655.16  25659.43  28155.26  11989.57  \n",
      "\n",
      "转换后的长表格式（类似Excel中的竖向数据）：\n",
      "            月份       销售额\n",
      "专业                      \n",
      "信息管理   2023-11  43676.33\n",
      "工商管理   2023-11  27915.15\n",
      "市场营销   2023-11  38290.83\n",
      "数据科学   2023-11  14463.78\n",
      "物流管理   2023-11  45543.72\n",
      "...        ...       ...\n",
      "市场营销   2024-11  23772.35\n",
      "数据科学   2024-11  18631.00\n",
      "物流管理   2024-11  13597.21\n",
      "电子商务   2024-11   3667.64\n",
      "计算机科学  2024-11  11989.57\n",
      "\n",
      "[91 rows x 2 columns]\n"
     ]
    }
   ],
   "source": [
    "# 首先创建一个宽表示例（类似Excel中的横向数据）\n",
    "monthly_sales = df_orders.pivot_table(\n",
    "    index='专业',\n",
    "    columns=df_orders['订单日期'].dt.to_period('M'),\n",
    "    values='订单金额',\n",
    "    aggfunc='sum'\n",
    ").round(2)\n",
    "\n",
    "print(\"原始宽表格式（类似Excel中横向展示的月度数据）：\")\n",
    "print(monthly_sales)\n",
    "\n",
    "# 转换为长表格式（类似Excel中的明细数据）\n",
    "long_format = monthly_sales.melt(\n",
    "    ignore_index=False,\n",
    "    var_name='月份',     \n",
    "    value_name='销售额'  \n",
    ")\n",
    "\n",
    "print(\"\\n转换后的长表格式（类似Excel中的竖向数据）：\")\n",
    "print(long_format)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "b5dbbe99-2a29-4dc4-b82d-d2eb43fab264",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "基础透视表（类似Excel简单透视表）：\n",
      "年级            大一         大三         大二         大四\n",
      "专业                                               \n",
      "信息管理   176319.09   85474.91  138618.26  155827.51\n",
      "工商管理   114008.62  178643.67  119090.93  153717.02\n",
      "市场营销   247607.34   90124.04   80764.88  160063.28\n",
      "数据科学   171047.14  118527.21  103220.57  189028.38\n",
      "物流管理   101942.49  113326.21  169515.89  242467.92\n",
      "电子商务   102401.74   93819.41  121408.16  164792.70\n",
      "计算机科学   98300.78  216603.31   86411.83  139453.13\n",
      "第二种写法\n",
      "年级            大一         大三         大二         大四\n",
      "专业                                               \n",
      "信息管理   176319.09   85474.91  138618.26  155827.51\n",
      "工商管理   114008.62  178643.67  119090.93  153717.02\n",
      "市场营销   247607.34   90124.04   80764.88  160063.28\n",
      "数据科学   171047.14  118527.21  103220.57  189028.38\n",
      "物流管理   101942.49  113326.21  169515.89  242467.92\n",
      "电子商务   102401.74   93819.41  121408.16  164792.70\n",
      "计算机科学   98300.78  216603.31   86411.83  139453.13\n"
     ]
    }
   ],
   "source": [
    "# 类似Excel中创建一个简单的数据透视表\n",
    "basic_pivot = df_orders.pivot_table(\n",
    "     index='专业',        # Excel中的行标签\n",
    "    columns='年级',      # Excel中的列标签\n",
    "    values='订单金额',   # Excel中的值\n",
    "    aggfunc='sum'       # Excel中的汇总方式\n",
    ")\n",
    "#也可以换一种写法\n",
    "basic_pivot1 = pd.pivot_table(\n",
    "    df_orders,\n",
    "    index='专业',        # Excel中的行标签\n",
    "    columns='年级',      # Excel中的列标签\n",
    "    values='订单金额',   # Excel中的值\n",
    "    aggfunc='sum'       # Excel中的汇总方式\n",
    ")\n",
    "print(\"基础透视表（类似Excel简单透视表）：\")\n",
    "print(basic_pivot)\n",
    "print(\"第二种写法\")\n",
    "print(basic_pivot1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "350e0688-37c6-4215-8edd-52169eeb6ff3",
   "metadata": {},
   "source": [
    "高级透视表（相当于Excel中的复杂数据透视表）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "d489d5d3-cff8-4948-a03f-29ad1eeb37cc",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "高级透视表（使用字符串指定聚合函数）：\n",
      "                sum                                                         \\\n",
      "               订单金额                                                          \n",
      "商品类别             图书      学习用品         服装       生活用品        电子产品       运动器材   \n",
      "专业    年级                                                                     \n",
      "信息管理  大一    3951.96    818.55    9333.45    6230.74   139149.71   14699.56   \n",
      "      大三    5825.83   1296.71    9173.38    4996.65    44059.05   16648.59   \n",
      "      大二    4445.37    946.16    5209.72    3944.09   102721.00   19795.88   \n",
      "      大四    3529.75    882.17    6963.59    5323.73   127011.47   10293.60   \n",
      "工商管理  大一    1915.45    916.78    3326.31    3520.49    93172.48    9172.11   \n",
      "      大三    2914.63   1690.00    8625.62    4918.25   147608.36   11139.94   \n",
      "      大二    2709.21   1498.82    8765.75    6867.91    89574.28    8624.65   \n",
      "      大四    4821.72    954.59   13580.14    7167.56   106795.21   16893.42   \n",
      "市场营销  大一    4674.78   1402.22   10881.84    8049.54   208069.25   11979.22   \n",
      "      大三    2799.57    960.10    8964.70    1758.72    66871.75    7236.27   \n",
      "      大二    3159.63   1148.98    8047.16    3498.19    49301.32   13020.95   \n",
      "      大四    5324.50   1647.77    6900.81    4907.56   127315.90   11619.00   \n",
      "数据科学  大一    5471.80    915.40    9564.70    3318.86   135259.08   14921.05   \n",
      "      大三    4071.01   2035.14    4918.38    3523.33    86758.73   14681.01   \n",
      "      大二    3550.16    855.15    9421.24    4829.24    67651.60   14316.96   \n",
      "      大四    3902.41   2099.02   13789.83    6231.16   153996.39    7440.88   \n",
      "物流管理  大一    3006.85   1305.44    5065.77    2170.22    81265.52    7178.55   \n",
      "      大三    1926.23   2071.94    9385.23    3031.83    87279.50    7885.62   \n",
      "      大二    2995.71   1038.70    5051.08    2274.99   144406.47   11833.69   \n",
      "      大四    5548.50   1996.77   13477.75   10820.87   193375.59   13746.27   \n",
      "电子商务  大一    3538.40   1920.56    8094.81    6847.30    66534.92   11898.33   \n",
      "      大三    2475.29   1373.17    9940.11    5277.16    65388.27    8936.39   \n",
      "      大二    3827.40   1009.43    5950.43    4156.15    87198.00   16858.74   \n",
      "      大四    4244.50   1338.47   10369.28    3818.35   125905.16   17393.57   \n",
      "计算机科学 大一    5498.89   1501.49   11609.20    1109.00    67245.69    9276.58   \n",
      "      大三    5411.99   1677.92   11722.56    5508.67   175574.13   13151.84   \n",
      "      大二    3955.34   1525.91    6264.25    4725.19    57684.60    9577.24   \n",
      "      大四    5902.16   1977.42    8077.15   11027.90    88851.28   21429.93   \n",
      "总计        111399.04  38804.78  242474.24  139853.65  2986024.71  351649.84   \n",
      "\n",
      "                                                ...    mean                 \\\n",
      "                                  购买数量          ...    订单金额           购买数量   \n",
      "商品类别            食品          总计      图书    学习用品  ...      食品       总计    图书   \n",
      "专业    年级                                        ...                          \n",
      "信息管理  大一   2135.12   176319.09    46.0    36.0  ...  133.44  1457.18  2.19   \n",
      "      大三   3474.70    85474.91    72.0    45.0  ...  182.88   718.28  3.13   \n",
      "      大二   1556.04   138618.26    53.0    38.0  ...  141.46  1400.18  3.79   \n",
      "      大四   1823.20   155827.51    41.0    25.0  ...  121.55  1640.29  2.93   \n",
      "工商管理  大一   1985.00   114008.62    21.0    34.0  ...  165.42  1461.65  2.62   \n",
      "      大三   1746.87   178643.67    37.0    60.0  ...  134.37  1595.03  3.08   \n",
      "      大二   1050.31   119090.93    33.0    56.0  ...  150.04  1266.92  2.54   \n",
      "      大四   3504.38   153717.02    60.0    34.0  ...  146.02  1147.14  3.33   \n",
      "市场营销  大一   2550.49   247607.34    57.0    54.0  ...  150.03  1919.44  2.85   \n",
      "      大三   1532.93    90124.04    40.0    37.0  ...  191.62  1251.72  3.08   \n",
      "      大二   2588.65    80764.88    30.0    38.0  ...  184.90   868.44  2.50   \n",
      "      大四   2347.74   160063.28    76.0    58.0  ...  180.60  1290.83  2.92   \n",
      "数据科学  大一   1596.25   171047.14    60.0    34.0  ...  145.11  1676.93  3.00   \n",
      "      大三   2539.61   118527.21    42.0    73.0  ...  181.40  1185.27  3.00   \n",
      "      大二   2596.22   103220.57    46.0    28.0  ...  136.64  1075.21  3.07   \n",
      "      大四   1568.69   189028.38    48.0    62.0  ...  142.61  1549.41  2.67   \n",
      "物流管理  大一   1950.14   101942.49    41.0    41.0  ...  162.51  1396.47  3.15   \n",
      "      大三   1745.86   113326.21    28.0    83.0  ...  134.30  1218.56  3.50   \n",
      "      大二   1915.25   169515.89    33.0    41.0  ...  147.33  1926.32  3.00   \n",
      "      大四   3502.17   242467.92    59.0    67.0  ...  159.19  1434.72  2.81   \n",
      "电子商务  大一   3567.42   102401.74    45.0    65.0  ...  162.16   825.82  2.65   \n",
      "      大三    429.02    93819.41    36.0    51.0  ...   85.80  1019.78  2.57   \n",
      "      大二   2408.01   121408.16    45.0    38.0  ...  172.00  1190.28  3.00   \n",
      "      大四   1723.37   164792.70    47.0    44.0  ...  143.61  1445.55  2.94   \n",
      "计算机科学 大一   2059.93    98300.78    63.0    52.0  ...  114.44   918.70  3.15   \n",
      "      大三   3556.20   216603.31    65.0    67.0  ...  161.65  1558.30  3.10   \n",
      "      大二   2679.30    86411.83    34.0    56.0  ...  167.46   929.16  3.09   \n",
      "      大四   2187.29   139453.13    62.0    72.0  ...  156.23   968.42  3.10   \n",
      "总计        62320.16  3932526.42  1320.0  1389.0  ...  153.12  1298.72  2.95   \n",
      "\n",
      "                                                    \n",
      "                                                    \n",
      "商品类别      学习用品    服装  生活用品  电子产品  运动器材    食品    总计  \n",
      "专业    年级                                            \n",
      "信息管理  大一  3.27  2.86  3.35  2.93  2.53  2.44  2.75  \n",
      "      大三  3.21  3.05  3.07  2.42  3.12  3.00  3.03  \n",
      "      大二  3.45  2.36  3.38  3.46  3.22  2.91  3.22  \n",
      "      大四  3.12  3.40  3.12  3.08  2.40  2.67  2.95  \n",
      "工商管理  大一  2.43  2.75  2.58  2.71  3.40  3.00  2.77  \n",
      "      大三  3.33  3.18  2.72  3.62  3.28  2.69  3.14  \n",
      "      大二  3.50  2.94  3.17  2.92  3.40  2.71  3.05  \n",
      "      大四  2.62  3.15  3.82  2.82  2.89  2.75  3.06  \n",
      "市场营销  大一  3.00  3.80  3.48  2.95  2.65  3.00  3.10  \n",
      "      大三  3.08  3.38  2.62  2.78  2.67  2.75  2.96  \n",
      "      大二  2.71  2.56  2.40  3.25  3.06  3.71  2.88  \n",
      "      大四  2.64  3.07  2.81  3.10  3.25  3.23  2.97  \n",
      "数据科学  大一  3.40  2.59  3.00  2.83  3.62  2.45  2.94  \n",
      "      大三  3.32  2.64  3.44  3.07  3.60  3.21  3.20  \n",
      "      大二  2.80  3.82  3.13  2.64  2.73  2.79  2.98  \n",
      "      大四  3.44  3.09  3.14  3.71  3.13  3.00  3.17  \n",
      "物流管理  大一  3.15  2.90  2.14  3.00  2.27  2.33  2.74  \n",
      "      大三  3.61  3.64  3.00  3.00  2.58  3.08  3.25  \n",
      "      大二  2.56  2.54  3.12  2.82  3.00  2.77  2.80  \n",
      "      大四  2.91  3.14  3.15  2.76  2.30  2.91  2.87  \n",
      "电子商务  大一  3.10  3.13  3.18  2.46  3.21  3.00  2.98  \n",
      "      大三  3.00  3.76  2.93  2.46  3.00  2.40  2.96  \n",
      "      大二  2.38  2.62  3.29  2.83  3.61  3.36  3.03  \n",
      "      大四  3.38  2.70  3.21  3.29  2.83  2.75  3.01  \n",
      "计算机科学 大一  3.25  3.09  2.25  3.60  2.56  3.00  3.05  \n",
      "      大三  2.79  2.75  2.81  3.32  3.31  3.32  3.04  \n",
      "      大二  3.11  3.70  3.29  2.25  3.08  3.12  3.09  \n",
      "      大四  3.27  2.65  3.38  3.21  3.08  2.71  3.09  \n",
      "总计        3.07  3.03  3.11  2.99  2.98  2.92  3.01  \n",
      "\n",
      "[29 rows x 32 columns]\n"
     ]
    }
   ],
   "source": [
    "advanced_pivot = pd.pivot_table(\n",
    "    df_orders,\n",
    "    index=['专业', '年级'],      # 行标签\n",
    "    columns='商品类别',          # 列标签\n",
    "    values=['订单金额', '购买数量'],  # 值\n",
    "    aggfunc=['sum', 'mean'],    # 使用字符串而不是np.sum, np.mean\n",
    "    margins=True,               # 显示总计\n",
    "    margins_name='总计'\n",
    ").round(2)\n",
    "\n",
    "print(\"\\n高级透视表（使用字符串指定聚合函数）：\")\n",
    "print(advanced_pivot)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "20317a51-0266-48f8-af85-5ac3b4f56416",
   "metadata": {},
   "source": [
    "### Excel对应操作说明：\n",
    "\n",
    "1. **基本对应关系**：\n",
    "   - index = Excel中的\"行标签\"\n",
    "   - columns = Excel中的\"列标签\"\n",
    "   - values = Excel中的\"值\"\n",
    "   - aggfunc = Excel中的\"汇总方式\"\n",
    "   - margins = Excel中的\"总计\"功能\n",
    "\n",
    "2. **与Excel的区别**：\n",
    "   - Excel中重复使用同一字段作为值时需要多次拖拽\n",
    "   - Excel中每个值字段只能选择一种汇总方式\n",
    "   - Pandas可以同时对不同字段使用不同的汇总方式\n",
    "\n",
    "3. **实际应用场景**："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "525e1596-1004-4e9b-b72f-882546b8b675",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "销售分析报表：\n",
      "            订单金额_图书  订单金额_学习用品    订单金额_服装  订单金额_生活用品   订单金额_电子产品  订单金额_运动器材  \\\n",
      "专业    年级                                                                      \n",
      "信息管理  大一    3951.96     818.55    9333.45    6230.74   139149.71   14699.56   \n",
      "      大三    5825.83    1296.71    9173.38    4996.65    44059.05   16648.59   \n",
      "      大二    4445.37     946.16    5209.72    3944.09   102721.00   19795.88   \n",
      "      大四    3529.75     882.17    6963.59    5323.73   127011.47   10293.60   \n",
      "工商管理  大一    1915.45     916.78    3326.31    3520.49    93172.48    9172.11   \n",
      "      大三    2914.63    1690.00    8625.62    4918.25   147608.36   11139.94   \n",
      "      大二    2709.21    1498.82    8765.75    6867.91    89574.28    8624.65   \n",
      "      大四    4821.72     954.59   13580.14    7167.56   106795.21   16893.42   \n",
      "市场营销  大一    4674.78    1402.22   10881.84    8049.54   208069.25   11979.22   \n",
      "      大三    2799.57     960.10    8964.70    1758.72    66871.75    7236.27   \n",
      "      大二    3159.63    1148.98    8047.16    3498.19    49301.32   13020.95   \n",
      "      大四    5324.50    1647.77    6900.81    4907.56   127315.90   11619.00   \n",
      "数据科学  大一    5471.80     915.40    9564.70    3318.86   135259.08   14921.05   \n",
      "      大三    4071.01    2035.14    4918.38    3523.33    86758.73   14681.01   \n",
      "      大二    3550.16     855.15    9421.24    4829.24    67651.60   14316.96   \n",
      "      大四    3902.41    2099.02   13789.83    6231.16   153996.39    7440.88   \n",
      "物流管理  大一    3006.85    1305.44    5065.77    2170.22    81265.52    7178.55   \n",
      "      大三    1926.23    2071.94    9385.23    3031.83    87279.50    7885.62   \n",
      "      大二    2995.71    1038.70    5051.08    2274.99   144406.47   11833.69   \n",
      "      大四    5548.50    1996.77   13477.75   10820.87   193375.59   13746.27   \n",
      "电子商务  大一    3538.40    1920.56    8094.81    6847.30    66534.92   11898.33   \n",
      "      大三    2475.29    1373.17    9940.11    5277.16    65388.27    8936.39   \n",
      "      大二    3827.40    1009.43    5950.43    4156.15    87198.00   16858.74   \n",
      "      大四    4244.50    1338.47   10369.28    3818.35   125905.16   17393.57   \n",
      "计算机科学 大一    5498.89    1501.49   11609.20    1109.00    67245.69    9276.58   \n",
      "      大三    5411.99    1677.92   11722.56    5508.67   175574.13   13151.84   \n",
      "      大二    3955.34    1525.91    6264.25    4725.19    57684.60    9577.24   \n",
      "      大四    5902.16    1977.42    8077.15   11027.90    88851.28   21429.93   \n",
      "All       111399.04   38804.78  242474.24  139853.65  2986024.71  351649.84   \n",
      "\n",
      "           订单金额_食品    订单金额_All  购买数量_图书  购买数量_学习用品  购买数量_服装  购买数量_生活用品  \\\n",
      "专业    年级                                                                 \n",
      "信息管理  大一   2135.12   176319.09     2.19       3.27     2.86       3.35   \n",
      "      大三   3474.70    85474.91     3.13       3.21     3.05       3.07   \n",
      "      大二   1556.04   138618.26     3.79       3.45     2.36       3.38   \n",
      "      大四   1823.20   155827.51     2.93       3.12     3.40       3.12   \n",
      "工商管理  大一   1985.00   114008.62     2.62       2.43     2.75       2.58   \n",
      "      大三   1746.87   178643.67     3.08       3.33     3.18       2.72   \n",
      "      大二   1050.31   119090.93     2.54       3.50     2.94       3.17   \n",
      "      大四   3504.38   153717.02     3.33       2.62     3.15       3.82   \n",
      "市场营销  大一   2550.49   247607.34     2.85       3.00     3.80       3.48   \n",
      "      大三   1532.93    90124.04     3.08       3.08     3.38       2.62   \n",
      "      大二   2588.65    80764.88     2.50       2.71     2.56       2.40   \n",
      "      大四   2347.74   160063.28     2.92       2.64     3.07       2.81   \n",
      "数据科学  大一   1596.25   171047.14     3.00       3.40     2.59       3.00   \n",
      "      大三   2539.61   118527.21     3.00       3.32     2.64       3.44   \n",
      "      大二   2596.22   103220.57     3.07       2.80     3.82       3.13   \n",
      "      大四   1568.69   189028.38     2.67       3.44     3.09       3.14   \n",
      "物流管理  大一   1950.14   101942.49     3.15       3.15     2.90       2.14   \n",
      "      大三   1745.86   113326.21     3.50       3.61     3.64       3.00   \n",
      "      大二   1915.25   169515.89     3.00       2.56     2.54       3.12   \n",
      "      大四   3502.17   242467.92     2.81       2.91     3.14       3.15   \n",
      "电子商务  大一   3567.42   102401.74     2.65       3.10     3.13       3.18   \n",
      "      大三    429.02    93819.41     2.57       3.00     3.76       2.93   \n",
      "      大二   2408.01   121408.16     3.00       2.38     2.62       3.29   \n",
      "      大四   1723.37   164792.70     2.94       3.38     2.70       3.21   \n",
      "计算机科学 大一   2059.93    98300.78     3.15       3.25     3.09       2.25   \n",
      "      大三   3556.20   216603.31     3.10       2.79     2.75       2.81   \n",
      "      大二   2679.30    86411.83     3.09       3.11     3.70       3.29   \n",
      "      大四   2187.29   139453.13     3.10       3.27     2.65       3.38   \n",
      "All       62320.16  3932526.42     2.95       3.07     3.03       3.11   \n",
      "\n",
      "          购买数量_电子产品  购买数量_运动器材  购买数量_食品  购买数量_All  \n",
      "专业    年级                                           \n",
      "信息管理  大一       2.93       2.53     2.44      2.75  \n",
      "      大三       2.42       3.12     3.00      3.03  \n",
      "      大二       3.46       3.22     2.91      3.22  \n",
      "      大四       3.08       2.40     2.67      2.95  \n",
      "工商管理  大一       2.71       3.40     3.00      2.77  \n",
      "      大三       3.62       3.28     2.69      3.14  \n",
      "      大二       2.92       3.40     2.71      3.05  \n",
      "      大四       2.82       2.89     2.75      3.06  \n",
      "市场营销  大一       2.95       2.65     3.00      3.10  \n",
      "      大三       2.78       2.67     2.75      2.96  \n",
      "      大二       3.25       3.06     3.71      2.88  \n",
      "      大四       3.10       3.25     3.23      2.97  \n",
      "数据科学  大一       2.83       3.62     2.45      2.94  \n",
      "      大三       3.07       3.60     3.21      3.20  \n",
      "      大二       2.64       2.73     2.79      2.98  \n",
      "      大四       3.71       3.13     3.00      3.17  \n",
      "物流管理  大一       3.00       2.27     2.33      2.74  \n",
      "      大三       3.00       2.58     3.08      3.25  \n",
      "      大二       2.82       3.00     2.77      2.80  \n",
      "      大四       2.76       2.30     2.91      2.87  \n",
      "电子商务  大一       2.46       3.21     3.00      2.98  \n",
      "      大三       2.46       3.00     2.40      2.96  \n",
      "      大二       2.83       3.61     3.36      3.03  \n",
      "      大四       3.29       2.83     2.75      3.01  \n",
      "计算机科学 大一       3.60       2.56     3.00      3.05  \n",
      "      大三       3.32       3.31     3.32      3.04  \n",
      "      大二       2.25       3.08     3.12      3.09  \n",
      "      大四       3.21       3.08     2.71      3.09  \n",
      "All            2.99       2.98     2.92      3.01  \n"
     ]
    }
   ],
   "source": [
    "# 创建一个销售分析报表（类似Excel中常见的销售分析透视表）\n",
    "sales_analysis = pd.pivot_table(\n",
    "    df_orders,  # 使用原始数据框df_orders\n",
    "    index=['专业', '年级'],  # 将'专业'和'年级'作为行索引，分组分析\n",
    "    columns=['商品类别'],  # 将'商品类别'作为列索引，展开不同商品类别\n",
    "    values=['订单金额', '购买数量'],  # 要分析的值为'订单金额'和'购买数量'\n",
    "    aggfunc={\n",
    "        '订单金额': 'sum',  # 对'订单金额'列进行求和，计算每个分组的总销售金额\n",
    "        '购买数量': 'mean'  # 对'购买数量'列进行求平均，计算每个分组的平均购买数量\n",
    "    },\n",
    "    margins=True,  # 添加总计行和总计列，显示整体的汇总数据\n",
    "    fill_value=0  # 将缺失值填充为0，避免数据为空\n",
    ").round(2)  # 将结果四舍五入到小数点后两位\n",
    "\n",
    "# 重命名列，使列名更易于阅读，使用f字符串格式\n",
    "sales_analysis.columns = [f'{col[0]}_{col[1]}' for col in sales_analysis.columns]\n",
    "\n",
    "print(\"销售分析报表：\")  # 输出销售分析报表的标题\n",
    "print(sales_analysis)  # 打印销售分析报表\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4786b521-3b93-49da-92b0-15b7bd17eaac",
   "metadata": {},
   "source": [
    "在 Pandas 中，stack 和 unstack 操作主要用于将数据框的行和列之间进行转换。它们类似于 Excel 中的“透视表”操作，具体如下：\n",
    "\n",
    "stack：将数据框的列索引“压缩”到行索引中，通常会将宽格式的数据转换为长格式。这类似于在 Excel 中将数据从列的布局转换成按行展示的布局。\n",
    "\n",
    "unstack：与 stack 相反，将行索引中的部分数据“解压”成列索引，通常将长格式的数据转换为宽格式。这类似于在 Excel 中将按行组织的数据转变成按列显示的形式。\n",
    "\n",
    "示例\n",
    "在 Excel 中，stack 操作可以类比为将多列的值“折叠”到一个列中，而 unstack 操作则可以类比为将一个列的值“展开”到多列中，就像在使用数据透视表时将字段拖动到行或列的位置。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "92b5523f-ffed-4306-8615-47777dcb61ee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Stack后的数据：\n",
      "                    sum           mean      \n",
      "                   订单金额  购买数量     订单金额  购买数量\n",
      "专业   年级 商品类别                                \n",
      "信息管理 大一 图书      3951.96  46.0   188.19  2.19\n",
      "        学习用品     818.55  36.0    74.41  3.27\n",
      "        服装      9333.45  63.0   424.25  2.86\n",
      "        生活用品    6230.74  57.0   366.51  3.35\n",
      "        电子产品  139149.71  44.0  9276.65  2.93\n",
      "\n",
      "Unstack后的数据：\n",
      "             sum                                                           \\\n",
      "            订单金额                                                            \n",
      "商品类别          图书     学习用品       服装     生活用品       电子产品      运动器材       食品   \n",
      "专业   年级                                                                     \n",
      "信息管理 大一  3951.96   818.55  9333.45  6230.74  139149.71  14699.56  2135.12   \n",
      "     大三  5825.83  1296.71  9173.38  4996.65   44059.05  16648.59  3474.70   \n",
      "     大二  4445.37   946.16  5209.72  3944.09  102721.00  19795.88  1556.04   \n",
      "     大四  3529.75   882.17  6963.59  5323.73  127011.47  10293.60  1823.20   \n",
      "工商管理 大一  1915.45   916.78  3326.31  3520.49   93172.48   9172.11  1985.00   \n",
      "\n",
      "                                ...    mean                                   \\\n",
      "                    购买数量        ...    订单金额           购买数量                     \n",
      "商品类别            总计    图书  学习用品  ...      食品       总计    图书  学习用品    服装  生活用品   \n",
      "专业   年级                         ...                                            \n",
      "信息管理 大一  176319.09  46.0  36.0  ...  133.44  1457.18  2.19  3.27  2.86  3.35   \n",
      "     大三   85474.91  72.0  45.0  ...  182.88   718.28  3.13  3.21  3.05  3.07   \n",
      "     大二  138618.26  53.0  38.0  ...  141.46  1400.18  3.79  3.45  2.36  3.38   \n",
      "     大四  155827.51  41.0  25.0  ...  121.55  1640.29  2.93  3.12  3.40  3.12   \n",
      "工商管理 大一  114008.62  21.0  34.0  ...  165.42  1461.65  2.62  2.43  2.75  2.58   \n",
      "\n",
      "                                 \n",
      "                                 \n",
      "商品类别     电子产品  运动器材    食品    总计  \n",
      "专业   年级                          \n",
      "信息管理 大一  2.93  2.53  2.44  2.75  \n",
      "     大三  2.42  3.12  3.00  3.03  \n",
      "     大二  3.46  3.22  2.91  3.22  \n",
      "     大四  3.08  2.40  2.67  2.95  \n",
      "工商管理 大一  2.71  3.40  3.00  2.77  \n",
      "\n",
      "[5 rows x 32 columns]\n",
      "\n",
      "指定level stack后的数据：\n",
      "支付方式              微信支付       支付宝       校园卡       银行卡\n",
      "专业   年级 商品类别                                        \n",
      "信息管理 大一 图书      672.76    792.30    821.25   1665.65\n",
      "        学习用品    162.24     29.88    151.67    474.76\n",
      "        服装     2028.57   2007.91   2561.59   2735.38\n",
      "        生活用品   1034.49   2013.27   2109.04   1073.94\n",
      "        电子产品  28070.33  42307.87  55854.75  12916.76\n"
     ]
    }
   ],
   "source": [
    "# 使用stack方法将列索引转为行索引，并使用future_stack=True参数以适应未来的Pandas版本\n",
    "stacked = advanced_pivot.stack(future_stack=True)\n",
    "print(\"Stack后的数据：\")  # 输出Stack后的数据\n",
    "print(stacked.head())  # 打印前几行的数据\n",
    "\n",
    "# 使用unstack方法将行索引转为列索引，将长格式数据恢复为宽格式\n",
    "unstacked = stacked.unstack()\n",
    "print(\"\\nUnstack后的数据：\")  # 输出Unstack后的数据\n",
    "print(unstacked.head())  # 打印前几行的数据\n",
    "\n",
    "# 4.2 创建具有多级索引的数据透视表\n",
    "multi_index = pd.pivot_table(\n",
    "    df_orders,  # 原始数据框\n",
    "    index=['专业', '年级'],  # 将'专业'和'年级'设置为行索引\n",
    "    columns=['商品类别', '支付方式'],  # 将'商品类别'和'支付方式'设置为列索引\n",
    "    values='订单金额',  # 使用'订单金额'列的值进行聚合\n",
    "    aggfunc='sum'  # 聚合函数为求和\n",
    ").round(2)  # 将结果四舍五入到小数点后两位\n",
    "\n",
    "# 使用stack方法指定某个索引级别进行转换\n",
    "level_stacked = multi_index.stack(level=0, future_stack=True)  # 将第一个级别的列索引转为行索引\n",
    "print(\"\\n指定level stack后的数据：\")  # 输出指定level stack后的数据\n",
    "print(level_stacked.head())  # 打印前几行的数据\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d536606d-deca-462c-967d-9e1da6b11aa7",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
